package medico.manager;

import geral.manager.GenericManager;
import geral.manager.UtilManager;
import geral.util.FacesUtil;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import paginacao.ListaPaginada;
import aspecto.annotation.Permissao;
import br.com.sgc.entities.cep.Cidade;
import br.com.sgc.entities.cep.UF;
import br.com.sgc.entities.geral.Endereco;
import br.com.sgc.entities.geral.PacientePessoa;
import br.com.sgc.entities.geral.PessoaFisica;
import br.com.sgc.entities.geral.Telefone;
import br.com.sgc.entities.medico.PlanoSaude;
import br.com.sgc.enuns.TipoOrdenacao;
import br.com.sgc.exception.ValidacaoException;
import br.com.sgc.permissao.Role;
import br.com.sgc.session.GenericSession;
import br.com.sgc.session.PacientePessoaSession;

@Named
@ConversationScoped
public class PacientePessoaManager extends GenericManager implements Serializable {

	private static final long serialVersionUID = 1364584874360105825L;
	
	private PacientePessoa paciente = new PacientePessoa();
	private List<PacientePessoa> pacientes = new ArrayList<PacientePessoa>();
	
	private List<PlanoSaude> listPlanoSaude = new ArrayList<PlanoSaude>();
	
	private Boolean isCpfValido;
	
	private Boolean isTelaAtendimento;
	
	@EJB private PacientePessoaSession pacienteSession;
	
	@EJB private GenericSession<PlanoSaude> planoSaudeSession;
	
	@Inject private UtilManager utilManager;

	private Boolean showPanelCadastro;
	
	@Permissao(role = Role.Sistema_SGC_Paciente_Salvar)
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public String prepareSave(){
		clear();
		showPanelCadastro = true;
		listPlanoSaude = planoSaudeSession.findAll(PlanoSaude.class, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId());
		paciente.setPessoa(new PessoaFisica());
		paciente.getPessoa().setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		return "formPaciente";
	}
	
	@Permissao(role = Role.Sistema_SGC_Paciente_Salvar)
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public String save() {
		try {
			paciente.getPessoa().setEnderecos(utilManager.getEnderecoManager().getEnderecoSession().prepareDependecies(utilManager.getEnderecoManager().getListEndereco(),paciente.getPessoa()));
			paciente.getPessoa().setTelefones(utilManager.getTelefoneManager().getTelefoneSession().prepareDependecies(utilManager.getTelefoneManager().getListTelefone(),paciente.getPessoa()));
			pacienteSession.save(paciente);
			FacesUtil.mensInfo("Salvo Com Sucesso!");
			return list();
		} catch (ValidacaoException e) {
			e.printStackTrace();
			FacesUtil.mensWarn(e.getMessage());
		}
		return null;
	}
	
	@Permissao(role = Role.Sistema_SGC_Paciente_Atualizar)
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public String update() {
		try {
			paciente.getPessoa().setEnderecos(utilManager.getEnderecoManager().getEnderecoSession().prepareDependecies(utilManager.getEnderecoManager().getListEndereco(),paciente.getPessoa()));
			paciente.getPessoa().setTelefones(utilManager.getTelefoneManager().getTelefoneSession().prepareDependecies(utilManager.getTelefoneManager().getListTelefone(),paciente.getPessoa()));
			pacienteSession.update(paciente);
			FacesUtil.mensInfo("Atualizado Com Sucesso!");
			return list();
		} catch (ValidacaoException e) {
			e.printStackTrace();
			FacesUtil.mensWarn(e.getMessage());
		}
		return null;
	}
	
	@Permissao(role = Role.Sistema_SGC_Paciente_Excluir)
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public String delete(){
		try {
			pacienteSession.delete(paciente);
			FacesUtil.mensInfo("Exclu�do com Sucesso!!!");
		} catch (Exception e) {
			FacesUtil.mensInfo("Imposs�vel Excluir");
		}
		
		return list();
	}

	
	@Permissao(role = Role.Sistema_SGC_Paciente_Listar)
	public String list() {
		paciente = new PacientePessoa();
		paciente.setPessoa(new PessoaFisica());;
		pacientes = new ListaPaginada<PacientePessoa>(pacienteSession, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId(), null, 5, "id", TipoOrdenacao.DESC);
		utilManager.getEnderecoManager().setRenderPanelCadastro(false);
		utilManager.getTelefoneManager().setRenderPanelCadastro(false);
		showPanelCadastro = false;
		return "formPaciente";
	}

	@Permissao(role = Role.Sistema_SGC_Paciente_Atualizar)
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public String prepareUpdate(){
		utilManager.getEnderecoManager().setRenderPanelCadastro(true);
		utilManager.getTelefoneManager().setRenderPanelCadastro(true);
		
		paciente = pacienteSession.findById(PacientePessoa.class, paciente.getId(), true);
		
		utilManager.getEnderecoManager().getListEndereco().clear();
		utilManager.getTelefoneManager().getListTelefone().clear();
		
		paciente.getPessoa().setEnderecos(utilManager.getEnderecoManager().getEnderecoSession().getEnderecosPersistent(paciente.getPessoa().getEnderecos()));
		paciente.getPessoa().setTelefones(utilManager.getTelefoneManager().getTelefoneSession().getTelefonesPersistent(paciente.getPessoa().getTelefones()));
		
		utilManager.getEnderecoManager().getListEndereco().addAll(paciente.getPessoa().getEnderecos());
		utilManager.getTelefoneManager().getListTelefone().addAll(paciente.getPessoa().getTelefones());
		
		
		listPlanoSaude = planoSaudeSession.findAll(PlanoSaude.class, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId());
		paciente.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		showPanelCadastro = true;
		isCpfValido = true;
		isTelaAtendimento = false;
		
		return "formPaciente";
	}
	
	public void validateCpf() {
		try {
			isCpfValido = false;
			pacienteSession.validarCPF(paciente.getPessoa().getCpf());
			paciente = pacienteSession.findByCPF(paciente.getPessoa().getCpf(), paciente.getPessoa().getClinica().getId());
			
			utilManager.getEnderecoManager().setRenderPanelLogradouro(false);
			utilManager.getEnderecoManager().setListCidade(new ArrayList<Cidade>());
			utilManager.getEnderecoManager().setListUF(new ArrayList<UF>());
			utilManager.getEnderecoManager().setRenderPanelCadastro(true);
			utilManager.getTelefoneManager().setRenderPanelCadastro(true);
			
			utilManager.getTelefoneManager().getListTelefone().clear();
			utilManager.getTelefoneManager().setTelefone(new Telefone());
			
			utilManager.getEnderecoManager().setEndereco(new Endereco());
			utilManager.getEnderecoManager().getListEndereco().clear();
			
			utilManager.getEnderecoManager().setListEndereco(paciente.getPessoa().getEnderecos());
			utilManager.getTelefoneManager().setListTelefone(paciente.getPessoa().getTelefones());
			
			isCpfValido = true;

		} catch (ValidacaoException e) {
			FacesUtil.mensWarn(e.getMessage());
		}
	}
	
	public void clear(){
		utilManager.getEnderecoManager().setRenderPanelLogradouro(false);
		utilManager.getEnderecoManager().setListCidade(new ArrayList<Cidade>());
		utilManager.getEnderecoManager().setListUF(new ArrayList<UF>());
		utilManager.getEnderecoManager().setRenderPanelCadastro(true);
		utilManager.getTelefoneManager().setRenderPanelCadastro(true);
		
		utilManager.getTelefoneManager().getListTelefone().clear();
		utilManager.getTelefoneManager().setTelefone(new Telefone());
		
		utilManager.getEnderecoManager().setEndereco(new Endereco());
		utilManager.getEnderecoManager().getListEndereco().clear();
		
		paciente = new PacientePessoa();
		paciente.getPessoa().setAtivo(true);
		paciente.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		isCpfValido = false;
		isTelaAtendimento = false;
	}

	public PacientePessoa getPaciente() {
		return paciente;
	}

	public void setPaciente(PacientePessoa paciente) {
		this.paciente = paciente;
	}

	public List<PacientePessoa> getPacientes() {
		return pacientes;
	}

	public void setPacientes(List<PacientePessoa> pacientes) {
		this.pacientes = pacientes;
	}

	public Boolean getIsCpfValido() {
		return isCpfValido;
	}

	public void setIsCpfValido(Boolean isCpfValido) {
		this.isCpfValido = isCpfValido;
	}

	public Boolean getIsTelaAtendimento() {
		return isTelaAtendimento;
	}

	public void setIsTelaAtendimento(Boolean isTelaAtendimento) {
		this.isTelaAtendimento = isTelaAtendimento;
	}

	public Boolean getShowPanelCadastro() {
		return showPanelCadastro;
	}

	public void setShowPanelCadastro(Boolean showPanelCadastro) {
		this.showPanelCadastro = showPanelCadastro;
	}

	public List<PlanoSaude> getListPlanoSaude() {
		return listPlanoSaude;
	}

	public void setListPlanoSaude(List<PlanoSaude> listPlanoSaude) {
		this.listPlanoSaude = listPlanoSaude;
	}
	
}
